/**
 * action状态管理思路
 * collection作为容器，数据交互中心，本身无状态，只负责传递，因此没有状态
 *      交流方式包括
 *      action-owner（提交后刷新） 使用owner
 *      owner->action(触发事件) 使用collcetion.actionCall
 *      action-action(互相调用) 使用collcetion.actionCall
 *      action-upper(跨级调用) 使用owner.$upperAction
 * temlate 代表单个action本身的状态，因此包含了标准的action状态与方法，作为对外接口，实质上是标准状态的操作工具
 * actionType 下层的action的具体功能逻辑通过 actionData 来作为向外统一传递数据的接口
 * 状态流程 
 wait（creatd） -> ready(文件加载完毕，按钮可用) -> call(调用)->
    -> ready(取消action或未达到要求)
    ->trigger（点击）[->首次加载]
        -> posting(提交加载) -> success/error(执行结果) -> ready
        -> fetching（加载数据）-> active（modal打开） -> posting(提交加载) -> success/error(执行结果) -> ready（提交完成）
                                                   -> close -> ready（关闭窗口）    
  通过基类中监听方法监听status值，通过设定onX方法来调用action类型中定义的方法  
 * 
 */

import Manifest from 'action/manifest'
import $ from '@/common'
export default {
  type: 'actionTemplate',
  state: {
    model: {},
    // action内容设置
    setting: {},
    getting: false, // 文件获取中
    gettingError: false, // 文件获取失败 
    ready: false, // 文件已加载 
    show: true, // 按钮显示状态
    enable: true, // 按钮可用状态
    fetching: false, // 数据查询中状态 
    posting: false, // 数据提交中状态
    fristLoad: true, // 首次加载
    enableSubmit: true, // 可提交
    active: true, // 激活状态，正在action操作中
    modal: false, // 模态窗口打开状态
    inline: { // 行内按钮控制状态
      enbale: true,
      show: true
    },
    actionInfo: {},
    // 触发参数（一般为数据行）
    payload: {},
    actionData: {},
    triggerData: {},
    //自定义扩展数据，根据不同情况使用的自定义数据对象
    extData: {},
    //提交成功返回数据
    successData: {},
    // 关联模块编码
    ownerStoreCode: null,
    collectionStoreCode: null,
    actionStatus: 'wait',
    // 操作状态 用于控制下方的额外控制栏 *暂未启用
    operate: [{
      code: 'submit',
      name: '提交',
      loading: false,
      show: true,
      enable: true
    }],
    lastStats: null, // 上次状态代码，用于辅助判断状态
    status: null // 状态显示代码
  },
  actions: {
    actionCall({
      state,
      commit,
      dispatch
    }, data) {
      commit('setTriggerData', data)
      dispatch('actionTrigger')
    },
    // 出发事件响应
    actionTrigger({
      dispath,
      commit,
      state,
      ...arg
    }, data) {
      commit('pushStatus', 'trigger')
    },
    // 触发成功，开始执行
    actionActive({
      commit,
      dispatch
    }) {
      dispatch('modalOpen')
      commit('setState', {
        code: 'fetching',
        value: false
      })
      commit('pushStatus', 'active')
    },
    // 加载初始化数据
    actionFetch({
      commit,
      dispatch
    }) {
      commit('setState', {
        code: 'fetching',
        value: true
      })
      commit('pushStatus', 'fetch')
    },
    actionCaller() {},
    actionSubmit({
      state,
      commit,
      dispatch
    }) {
      commit('pushStatus', 'submit')
    },
    actionPosting({
      state,
      commit,
      dispatch
    }) {
      commit('setState', {
        code: 'posting',
        value: true
      })
      commit('pushStatus', 'posting')
    },
    actionSuccess({
      state,
      commit,
      dispatch
    }, data) {
      commit('setState', {
        code: 'posting',
        value: false
      })
      commit('setSuccessData', data)
      commit('pushStatus', 'success')
      //异步执行取消，防止取消组织了sucess响应
      setTimeout(() => {
        //dispatch('actionCancel')
      })
    },
    // 错误状态处理，将会回到上一步状态
    actionError({
      commit
    }, status) {
      // 停止所有加载状态
      commit('setState', {
        code: 'posting',
        value: false
      })
      commit('setState', {
        code: 'fetching',
        value: false
      })
      if (status) {
        commit('pushStatus', status)
      }
    },
    // 取消操作/关闭弹窗
    actionCancel({
      state,
      commit,
      dispatch
    }) {
      if (state.status === 'ready') {
        //return
      }
      if (state.modal) {
        dispatch('modalClose')
      }
      commit('resetStatus')
      // 回到预备状态
      commit('pushStatus', 'ready')
    },
    modalOpen({
      commit
    }) {
      commit('setModal', true)
    },
    modalClose({
      commit
    }) {
      commit('setModal', false)
    },
    // 控制owner相关方法
    ownerCommit({
      state,
      common
    }, {
      code,
      data
    }) {
      common(`${state.ownerStoreCode}/${code}`, data, {
        root: true
      })
    },
    ownerDispatch({
      state,
      dispatch
    }, {
      code,
      data
    }) {
      dispatch(`${state.ownerStoreCode}/${code}`, data, {
        root: true
      })
    }
  },
  getters: {
    actionParam(state, getters, rootState) {
      return state.model.param || {}
    },
    // 是否依赖选中数据，根据scope获得结果
    needSelect(state) {
      var v = false
      var scope = state.model.scope
      if (scope === 'data' || scope === 'line' || scope === 'rows') {
        v = true
      }
      return v
    },
    // 目标针对一条数据,根据scope获得结果
    needSelectOne(state) {
      var v = false
      var scope = state.model.scope
      if (scope === 'line' || scope === 'data') {
        v = true
      }
      return v
    },
    //通过路径编码取得owner的状态对象
    ownerState(state, getters, rootState) {
      return $.getPathValue(rootState, state.ownerStoreCode)
    },
    ownerGetters(state, getters, rootState, rootGetters) {
      return rootGetters[state.ownerStoreCode]
    },
    onwerSelectedData(state, getters, rootState, rootGetters) {
      return rootGetters[`${state.ownerStoreCode}/selectedData`]
    },
    onwerSelectedCount(state, getters, rootState, rootGetters) {
      return rootGetters[`${state.ownerStoreCode}/selectedCount`]
    },
    scopeParam(state, getters) {
      switch (state.model.scope) {
        case 'data':
          return getters.rowData
        case 'rows':
          var list = []
          for (let i in state.triggerData) {
            list.push(state.triggerData[i].id)
          }
          return list
        case 'line':
          return getters.rowData && getters.rowData.id
        default:
          return null
      }
    },
    //首条选中数据
    rowData(state) {
      for (let i in state.triggerData) {
        return state.triggerData[i]
      }
      return null
    },
    //首条数据序号
    rowIndex(state) {
      for (let i in state.triggerData) {
        return i
      }
      return null
    },
    scopeEnable(state, getters, rootState, rootGetters) {
      if (getters.needSelect) {
        return getters.onwerSelectedCount > 0
      } else {
        return true
      }
    }
  },
  mutations: {
    setModel(state, data) {
      $.set(state, 'model', data)
      $.set(state, 'actionInfo', Manifest[data.type] || {})
    },
    setModal(state, v) {
      state.modal = v
    },
    // 状态快速设置时方法
    setState(state, {
      code,
      value
    }) {
      $.set(state, code, value)
    },
    // 重置按钮使用状态
    resetStatus() {},
    pushStatus(state, code) {
      state.lastStatus = state.status
      $.set(state, 'status', code)
    },
    setTriggerData(state, data) {
      $.set(state, 'triggerData', data)
    },
    backStatus(state) {
      $.set(state, 'status', state.lastStatus)
    },
    setSuccessData(state, data) {
      $.set(state, 'successData', data)
    },
    setSetting(state, data) {
      $.set(state, 'setting', data)
    },
    setExtData(state, data) {
      $.set(state, 'extData', data)
    }
  }
}
